package main

import (
	"fmt"
	"image"
	"sync"
	"time"
)

// image 实现了基本的2D图片库
var icons map[string]image.Image

func loadIcons() {

}

// Icon 被多个goroutine调用时不是并发安全的
func Icon(name string) image.Image {
	if icons == nil {
		loadIcons()
	}
	return icons[name]
}

// Icon 是并发安全的
// func Icon(name string) image.Image {
// 	loadIconsOnce.Do(loadIcons)
// 	return icons[name]
// }

//并发安全单例模式
type singleton struct{}

var instance *singleton
var once sync.Once

// GetInstance ...
func GetInstance() *singleton {
	once.Do(func() {
		instance = &singleton{}
	})
	return instance
}

//并发安全单例模式

func main() {
	fmt.Println("sync.Once")
	time.Sleep(time.Second)
	fmt.Println(`在编程的很多场景下我们需要确保某些操作在高并发的场景下只执行一次，例如只加载一次配置文件、只关闭一次通道等。`)
	fmt.Println(GetInstance())
}
